# -*- coding: utf-8 -*-

#Descrição: Classe para efectuar as estatisticas à BD Rebides
#Data: 04/12/11
#Autor: Luís Costa Nº 6032
#-----------------------------------------------
import sys
from ProcessCSV import ProcessCSV
from ProcessHTML import ProcessHTML
from Graphics import Graphics

class Statistics:
    
    #Construtor da classe.
    def __init__(self):
        self.processCSV = ProcessCSV()
        self.processHTML = ProcessHTML()
        self.graph = Graphics()
        
        #Variaveis para guardar o resultado das estatisticas
        #Desta forma é possivel criar os CSV, as listagens e os gráficos
        #sem voltar a processar os dados
        #--------------------------
        self.dataTeachersPerEstablishment = []
        self.dataTeachersPerCategory= []
        self.dataTeachersPerTDegree= []
    pass
    
    #Gera as estatisticas do número professores por estabelecimento e por ano.
    #Recebe uma ligação à BD.
    #---------------------------------------
    def stat_teachers_per_establishment(self, db):
        
        #Vai á BD buscar os dados
        #----------------
        dictData = db.get_teachers_per_establishment_data()
        
        #Cria um dicionário com os totais.
        #--------------------------
        dictStat = {}
        dictEstabs = {}
        
        print 'A efetuar as contagens dos totais...'
        #Percorre cada ano e os estabelecimentos desse ano
        #-------------------
        for ano, dictEstabs in dictData.iteritems():
            
            dictStat[ano] = {}
            #Vai percorrer os dicionarios dos docentes e verficar quantos 
            #elementos tem.
            #------------------
            dictDocentes = {}
            for estab, dictDocentes in dictEstabs.iteritems():
                #Conta o total e adiciona ao dicionario dos totais
                dictStat[ano][estab] = len(dictDocentes)
            pass
        pass
        #--------------------------
        print 'Contagens efetuadas!'
        
        #Cria o cabeçalho do CSV
        header = ['Ano', 'Estabelecimento', 'Total Professores']
        values = []
        
        #Cria as listagens dos gráficos
        graphLabels = []
        graphValues = []
        
        #Cria uma lista de listas com os valores a inserir
        #------------
        for ano, dictEstabs in dictStat.iteritems():

            for estab, total in dictEstabs.iteritems():
                
                row = [ano, estab, total]
                values.append(row)
                
                #Trata ja os dados para os gráficos
                #---------------
                graphLabels.append(str(ano) + '-' + estab)
                graphValues.append(total)
            pass
        pass
        
        #Guarda os dados do processamento para posteriormente criar o CSV,
        #listagens e gráficos
        #-----------------------
        self.dataTeachersPerEstablishment.append(header)
        self.dataTeachersPerEstablishment.append(values)
        self.dataTeachersPerEstablishment.append(graphValues)
        self.dataTeachersPerEstablishment.append(graphLabels)
        self.dataTeachersPerEstablishment.append(dictData)
    pass
    #---------------------------------------
    
    #Cria um CSV com os dados dos professores por estabelecimento
    #---------------------------------------
    def csv_teachers_per_establishment(self):

        filename = 'Professores_por_estabelecimento'
        self.processCSV.create_CSV_from_list(filename, \
            self.dataTeachersPerEstablishment[0], \
            self.dataTeachersPerEstablishment[1])
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por estabelecimento
    #---------------------------------------
    def list_teachers_per_establishment(self):
        
        self.processHTML.list_teachers_per_establishment(\
            self.dataTeachersPerEstablishment[4])
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por estabelecimento
    #---------------------------------------
    def graph_teachers_per_establishment(self):
        
        self.graph.create_graph('Professores por estabelecimento', \
            self.dataTeachersPerEstablishment[2], \
            self.dataTeachersPerEstablishment[3])
    pass
    #---------------------------------------

    #Gera as estatisticas do número professores por categoria, 
    #por estabelecimento e por ano.
    #Recebe uma ligação à BD.
    #---------------------------------------
    def stat_teachers_per_category_establishment_year(self, db):
        
        #Vai á BD buscar os dados
        #----------------
        dictData = db.get_teachers_per_category_establishment_year_data()
        
        #Cria um dicionário com os totais.
        #--------------------------
        dictStat = {}
        dictEstabs = {}
        
        print 'A efetuar as contagens dos totais...'
        #Percorre cada categoria e os estabelecimentos
        #-------------------
        for categoria, dictEstabs in dictData.iteritems():
            
            dictStat[categoria] = {}
            
            #Vai percorrer cada estabelecimento e o ano
            #------------------
            dictAno = {}
            for estab, dictAno in dictEstabs.iteritems():

                dictStat[categoria][estab] = {}
                #Vai percorrer cada ano e conta os docentes
                #------------------
                dictDocentes = {}
                for ano, dictDocentes in dictAno.iteritems():

                    #Conta o total e adiciona ao dicionario dos totais
                    dictStat[categoria][estab][ano] = len(dictDocentes)
                pass                
            pass
        pass
        #--------------------------
        print 'Contagens efetuadas!'

        #Cria o cabeçalho do CSV
        header = ['Categoria', 'Estabelecimento', 'Ano', 'Total Professores']
        values = []
        
        #Cria as listagens dos gráficos
        graphLabels = []
        graphValues = []
        
        #Cria uma lista de listas com os valores a inserir
        #------------
        n = 0
        for categoria, dictEstabs in dictStat.iteritems():

            for estab, dictAno in dictEstabs.iteritems():
                
                for ano, total in dictAno.iteritems():

                    row = [categoria, estab, ano, total]
                    values.append(row)
                    
                    #Trata ja os dados para os gráficos
                    #---------------
                    graphLabels.append(categoria + '-' + \
                                        str(ano) + '-' + estab)
                    graphValues.append(total)
                pass
            pass
        pass
        
        #Guarda os dados do processamento para posteriormente criar o CSV,
        #listagens e gráficos
        #-----------------------
        self.dataTeachersPerCategory.append(header)
        self.dataTeachersPerCategory.append(values)
        self.dataTeachersPerCategory.append(graphValues)
        self.dataTeachersPerCategory.append(graphLabels)
        self.dataTeachersPerCategory.append(dictData)
    pass
    #---------------------------------------
    
    #Cria um CSV com os dados dos professores por categoria
    #---------------------------------------
    def csv_teachers_per_category(self):

        filename = 'Professores_por_categoria_estabelecimento_ano'
        self.processCSV.create_CSV_from_list(filename, \
            self.dataTeachersPerCategory[0], \
            self.dataTeachersPerCategory[1])
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por categoria
    #---------------------------------------
    def list_teachers_per_category(self):
        
        self.processHTML.list_teachers_per_category_establishment_year(\
            self.dataTeachersPerCategory[4])
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por categoria
    #---------------------------------------
    def graph_teachers_per_category(self):
        
        self.graph.create_graph('Professores por categoria e estabelecimento', \
            self.dataTeachersPerCategory[2], \
            self.dataTeachersPerCategory[3])
    pass
    #---------------------------------------
    
    #Gera as estatisticas do número professores por tipo de grau, 
    #por estabelecimento e por ano.
    #Recebe uma ligação à BD.
    #---------------------------------------
    def stat_teachers_per_type_degree_establishment_year(self, db):
        
        #Vai á BD buscar os dados
        #----------------
        dictData = db.get_teachers_per_type_degree_establishment_year_data()
        
        #Cria um dicionário com os totais.
        #--------------------------
        dictStat = {}
        dictEstabs = {}
        
        print 'A efetuar as contagens dos totais...'
        #Percorre cada tipo de grau e os estabelecimentos
        #-------------------
        for tipoGrau, dictEstabs in dictData.iteritems():
            
            dictStat[tipoGrau] = {}
            
            #Vai percorrer cada estabelecimento e o ano
            #------------------
            dictAno = {}
            for estab, dictAno in dictEstabs.iteritems():

                dictStat[tipoGrau][estab] = {}
                #Vai percorrer cada ano e conta os docentes
                #------------------
                dictDocentes = {}
                for ano, dictDocentes in dictAno.iteritems():

                    #Conta o total e adiciona ao dicionario dos totais
                    dictStat[tipoGrau][estab][ano] = len(dictDocentes)
                pass                
            pass
        pass
        #--------------------------
        print 'Contagens efetuadas!'

        #Cria o cabeçalho do CSV
        header = ['Tipo de Grau', 'Estabelecimento', 'Ano', 'Total Professores']
        values = []
        
        #Cria as listagens dos gráficos
        graphLabels = []
        graphValues = []
        
        #Cria uma lista de listas com os valores a inserir
        #------------
        n = 0
        for tipoGrau, dictEstabs in dictStat.iteritems():

            for estab, dictAno in dictEstabs.iteritems():
                
                for ano, total in dictAno.iteritems():

                    row = [tipoGrau, estab, ano, total]
                    values.append(row)
                    
                    #Trata ja os dados para os gráficos
                    #---------------
                    graphLabels.append(tipoGrau + '-' + '-' + \
                                        estab + str(ano))
                    graphValues.append(total)
                pass
            pass
        pass
        
        #Guarda os dados do processamento para posteriormente criar o CSV,
        #listagens e gráficos
        #-----------------------
        self.dataTeachersPerTDegree.append(header)
        self.dataTeachersPerTDegree.append(values)
        self.dataTeachersPerTDegree.append(graphValues)
        self.dataTeachersPerTDegree.append(graphLabels)
        self.dataTeachersPerTDegree.append(dictData)
    pass
    #---------------------------------------
    
    #Cria um CSV com os dados dos professores por tipo de grau
    #---------------------------------------
    def csv_teachers_per_tdegree(self):

        filename = 'Professores_por_tipo_grau_estabelecimento_ano'
        self.processCSV.create_CSV_from_list(filename, \
            self.dataTeachersPerTDegree[0], \
            self.dataTeachersPerTDegree[1])
    pass
    #---------------------------------------
    
    #Cria uma listagem HTML os dados dos professores por tipo de grau
    #---------------------------------------
    def list_teachers_per_tdegree(self):
        
        self.processHTML.list_teachers_per_type_degree_establishment_year(\
            self.dataTeachersPerTDegree[4])
    pass
    #---------------------------------------
    
    #Cria uma gráfico com os dados dos professores por tipo de grau
    #---------------------------------------
    def graph_teachers_per_tdegree(self):
        
        self.graph.create_graph('Professores por tipo de grau' + \
                                    ' estabelecimento e por ano', \
            self.dataTeachersPerTDegree[2], \
            self.dataTeachersPerTDegree[3])
    pass
    #---------------------------------------